// IO函子
// 1.IO函子中的_value是一个函数,这里把函数作为值来处理
// 2.IO函子可以把不纯的动作存储到_value中,延迟执行这个不纯的操作(惰性执行),包装当前的操作纯
// 3.把不纯的操作交给调用者来处理

const fp = require("lodash/fp");

class IO {
  static of(value) {
    return new IO(function () {
      return value;
    });
  }
  constructor(fn) {
    this._value = fn;
  }
  map(fn) {
    return new IO(fp.flowRight(fn, this._value));
  }
}
// process.execPath 属性返回启动 Node.js 进程的可执行文件的绝对路径名
let r = IO.of(process).map((p) => p.execPath);
console.log(r); //IO {_value : [Function]}
console.log(r._value()); //D:\node.exe
